package com.webfluxexample.webflux.handler;

import com.webfluxexample.webflux.error.GlobalException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;


import java.util.Optional;

/**
 * 服务处理类
 * */
@Component
public class CityHandler {

    /**
     * Mono：实现发布者，并返回 0 或 1 个元素，即单对象。Mono 是响应流 Publisher 具有基础 rx 操作符。
     * 可以成功发布元素或者错误。
     * 用 Mono 作为返回对象，是因为返回包含了一个 ServerResponse 对象，而不是多个元素。
     *
     * ServerResponse 是对响应的封装，可以设置响应状态，响应头，响应正文。
     * 比如 ok 代表的是 200 响应码、MediaType 枚举是代表这文本内容类型、返回的是 String 的对象。
     *
     * ServerRequest 是对请求的封装。从请求中拿出 city 的值，如果没有的话则抛出对应的异常。
     * GlobalException 是封装的全局异常。
     *
     *
     * */
    public Mono<ServerResponse> helloCity(ServerRequest request) {
        return ServerResponse.ok().body(sayHelloCity(request), String.class);
    }

    private Mono<String> sayHelloCity(ServerRequest request) {
        Optional<String> cityParamOptional = request.queryParam("city");
        if (!cityParamOptional.isPresent()) {
            throw new GlobalException(HttpStatus.INTERNAL_SERVER_ERROR
                    , "request param city is ERROR");
        }

        return Mono.just("Hello," + cityParamOptional.get());
    }
}
